package reflection;

import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author DCSGO
 * @version 1.0
 * 初识反射4大类
 */
public class Reflection01 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Properties properties = new Properties();
        properties.load(new FileReader("src\\re.properties"));
        String classfullpath = properties.getProperty("classfullpath");
        String methodName = properties.getProperty("method");

        //加载类 返回 Class 类型的对象 cls
        Class cls = Class.forName(classfullpath);
        System.out.println("cls = " + cls);
        //cls = class cat.Cat

        //通过 cls 得到它加载的类的 对象实例 o
        Object o = cls.newInstance();
        System.out.println("o.getClass = " + o.getClass());
        //o.getClass = class cat.Cat

        //通过 cls 得到它加载的类的 与 methodName 对应的方法对象
        Method met = cls.getMethod(methodName);
        System.out.println(met);
        //public void cat.Cat.move()

        //通过 met 调用方法 -> 通过方法对象来实现调用 cls 的该方法
        met.invoke(o);/* 传统方法 对象.方法() 反射机制 方法.invoke(对象) */
        //招财猫 在跑！

        //通过 getField(成员属性名/字段名) 获取其对应的 Field 对象 -> 成员属性/字段
        Field age = cls.getField("age");//无法获取私有的 成员属性/字段
        System.out.println("Field age = " + age);//Field age = public int cat.Cat.age
        //通过 age 对象获取 o 的该字段
        System.out.println("o.age = " + age.get(o));//o.age = 1

        //通过 getConstructor(参数类型) 获取其对应的 Constructor 对象 -> 构造器
        Constructor cons1 = cls.getConstructor();
        System.out.println(cons1);//public cat.Cat()
        Constructor cons2 = cls.getConstructor(String.class);
        System.out.println(cons2);//public cat.Cat(java.lang.String)
    }
}
